home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / MyOOAboutHelp.p < prev    next >
Encoding:
Text File  |  1994-09-21  |  7.4 KB  |  358 lines  |  [TEXT/PJMM]

  1. unit MyOOAboutHelp;
  2.  
  3. interface
  4.  
  5.     uses
  6.         MyOOMainLoop;
  7.  
  8.     const
  9.         agwtAbout = '•About';
  10.         agwtHelp = '•Help';
  11.  
  12.     type
  13.         AboutStringsObject = object
  14.                 function GetString (index: integer): str255;
  15.             end;
  16.  
  17.     var
  18.         about_click_count: longInt;
  19.  
  20.     procedure InitAboutHelp (obj: AboutStringsObject);
  21.     procedure UpdateAboutBox;
  22.     procedure OpenAboutBox;
  23.     procedure CloseAboutBox;
  24.     procedure ExternalAboutHelp (var x: ptr; id: integer);
  25.     procedure ExternalSetMenu (themenu, theitem: integer; x: ptr);
  26.  
  27. implementation
  28.  
  29.     uses
  30.         MyMenus, MyDialogs, MyStrings, MyVersionResource, MySystemGlobals, IconFamilies,{}
  31.         MyFMenus, AERegistry, MyAEUtils, AEObjects, MyStrh, MyUtils, MyTypes, BaseGlobals;
  32.  
  33.     const
  34.         text_item = 3;
  35.         about_dialog_ID = 128;
  36.         help_dialog_ID = 129;
  37.         about_strh_id = 928;
  38.         kAEHelp = 'help';
  39.  
  40.     type
  41.         BaseObject = object(DObject)
  42.                 global_object: ^WObject;
  43.                 procedure Create (id: integer);
  44.                 override;
  45.                 procedure Destroy;
  46.                 override;
  47.             end;
  48.  
  49.     type
  50.         VerObject = object(BaseObject)
  51.                 text, styles: handle;
  52.                 procedure Create (id: integer);
  53.                 override;
  54.                 procedure Destroy;
  55.                 override;
  56.                 procedure DrawTextData;
  57.             end;
  58.         AboutObject = object(BaseObject)
  59.                 procedure DoItem (item: integer);
  60.                 override;
  61.             end;
  62.  
  63.     var
  64.         about_object: BaseObject;
  65.         help_object: VerObject;
  66.         old_about: boolean;
  67.         strings: AboutStringsObject;
  68.  
  69.     procedure AboutObject.DoItem (item: integer);
  70.         var
  71.             r: rect;
  72.     begin
  73.         about_click_count := about_click_count + 1;
  74.         GetDItemRect(window, item, r);
  75.         SetPort(window);
  76.         InvalRect(r);
  77.     end;
  78.  
  79.     function AboutStringsObject.GetString (index: integer): str255;
  80.         var
  81.             vers: versionRecord;
  82.     begin
  83.         GetVersion(vers);
  84.         case index of
  85.             0: 
  86.                 GetString := vers.long;
  87.             1: 
  88.                 GetString := vers.short;
  89.             2: 
  90.                 GetString := vers.name;
  91.             otherwise
  92.                 GetString := '???';
  93.         end;
  94.     end;
  95.  
  96.     procedure DrawTextItem (dlg: dialogPtr; item: integer);
  97.     begin
  98.         VerObject(GetWObject(dlg)).DrawTextData;
  99.     end;
  100.  
  101.     procedure BaseObject.Destroy;
  102.     begin
  103.         global_object^ := nil;
  104.         inherited Destroy;
  105.     end;
  106.  
  107.     procedure VerObject.DrawTextData;
  108.         var
  109.             te: TEHandle;
  110.             r: rect;
  111.     begin
  112.         GetDItemRect(window, text_item, r);
  113.  
  114.         te := TEStylNew(r, r);
  115.         HLock(text);
  116.         TEStylInsert(text^, GetHandleSize(text), StScrpHandle(styles), te);
  117.         HUnlock(text);
  118.  
  119.         TEUpdate(r, te);
  120.         TEDispose(te);
  121.     end;
  122.  
  123.     procedure BaseObject.Create (id: integer);
  124.         var
  125.             s: str255;
  126.             vers: versionRecord;
  127.     begin
  128.         inherited Create(id);
  129.         GetWTitle(window, s);
  130.         GetVersion(vers);
  131.         SPrintS3(s, s, vers.name, '', '');
  132.         SetWTitle(window, s);
  133.     end;
  134.  
  135.     procedure VerObject.Create (id: integer);
  136.         var
  137.             k: integer;
  138.             h: handle;
  139.             r: rect;
  140.             te: TEHandle;
  141.             add: integer;
  142.     begin
  143.         text := nil;
  144.         styles := nil;
  145.         UseResFile(app_resfile);
  146.         SetVersionParamText('');
  147.         inherited Create(id);
  148.         SetPort(window);
  149.         TextFont(geneva);
  150.         GetDItem(window, text_item, k, h, r);
  151.         if BAND(k, $7F) = userItem then begin
  152.             text := GetResource('TEXT', id);
  153.             if text <> nil then begin
  154.                 HNoPurge(text);
  155.                 styles := GetResource('styl', id);
  156.                 HNoPurge(styles);
  157.  
  158.                 te := TEStylNew(r, r);
  159.                 HLock(text);
  160.                 TEStylInsert(text^, GetHandleSize(text), StScrpHandle(styles), te);
  161.                 HUnlock(text);
  162.                 HPurge(text);
  163.                 HPurge(styles);
  164.  
  165.                 add := r.top - r.bottom + TEGetHeight(0, te^^.nLines, te);
  166.                 TEDispose(te);
  167.                 r.bottom := r.bottom + add;
  168.                 SetDItem(window, text_item, k, HANDLE(@DrawTextItem), r);
  169.                 r := window^.portRect;
  170.                 SizeWindow(window, r.right - r.left, r.bottom - r.top + add, false);
  171.             end;
  172.         end;
  173.     end;
  174.  
  175.     procedure VerObject.Destroy;
  176.     begin
  177.         if text <> nil then
  178.             ReleaseResource(text);
  179.         if styles <> nil then
  180.             ReleaseResource(styles);
  181.         inherited Destroy;
  182.     end;
  183.  
  184.     procedure DoAboutHelp (var obj: VerObject; id: integer);
  185.     begin
  186.         if obj <> nil then begin
  187.             if FrontWindow <> obj.window then begin
  188.                 SelectWindow(obj.window);
  189.             end;
  190.         end
  191.         else begin
  192.             new(obj);
  193.             obj.global_object := @obj;
  194.             obj.Create(id);
  195.             ShowWindow(obj.window);
  196.         end;
  197.     end;
  198.  
  199.     procedure ExternalAboutHelp (var x: ptr; id: integer);
  200.     begin
  201.         DoAboutHelp(VerObject(x), id);
  202.     end;
  203.  
  204.     procedure DoHelp;
  205.     begin
  206.         DoAboutHelp(help_object, help_dialog_id);
  207.         help_object.AppleGuideWindowType := agwtHelp;
  208.     end;
  209.  
  210.     procedure AboutDisplayStyledString (dlg: dialogPtr; item: integer);
  211.         var
  212.             s, t: str255;
  213.             i: integer;
  214.     begin
  215.         GetIndString(s, about_strh_id, item);
  216.         i := 1;
  217.         while (i < length(s)) do begin
  218.             if s[i] = '^' then begin
  219.                 t := strings.GetString(ord(s[i + 1]) - ord('0'));
  220.                 Delete(s, i, 2);
  221.                 Insert(t, s, i);
  222.                 i := i + length(t);
  223.             end
  224.             else begin
  225.                 i := i + 1;
  226.             end;
  227.         end;
  228.         DisplayStyledString(dlg, item, s);
  229.     end;
  230.  
  231.     procedure DrawAboutIcon (dlg: DialogPtr; item: integer);
  232.         var
  233.             r: rect;
  234.             junk: OSErr;
  235.     begin
  236.         GetDItemRect(dlg, item, r);
  237.         junk := PlotIconID(r, atNone, ttNone, 128);
  238.     end;
  239.  
  240.     procedure DoAbout;
  241.         var
  242.             i, k: integer;
  243.     begin
  244.         about_click_count := about_click_count + 1;
  245.         if old_about | (about_object <> nil) then begin
  246.             DoAboutHelp(VerObject(about_object), about_dialog_id);
  247.         end
  248.         else begin
  249.             new(AboutObject(about_object));
  250.             about_object.global_object := @about_object;
  251.             about_object.Create(about_dialog_id);
  252.             GetDItemKind(about_object.window, 1, k);
  253.             if k = $80 then begin
  254.                 SetDItemHandle(about_object.window, 1, handle(@DrawAboutIcon));
  255.             end;
  256.             for i := 2 to 30 do begin
  257.                 if GetIndStr(about_strh_id, i) <> '' then begin
  258.                     SetDItemHandle(about_object.window, i, @AboutDisplayStyledString);
  259.                 end;
  260.             end;
  261.             ShowWindow(about_object.window);
  262.         end;
  263.         about_object.AppleGuideWindowType := agwtAbout;
  264.     end;
  265.  
  266.     procedure DoAboutMenu;
  267.     begin
  268.         if has_AppleEvents then begin
  269.             SendSelfSimpleEvent(kAECoreSuite, kAEAbout);
  270.         end
  271.         else begin
  272.             DoAbout;
  273.         end;
  274.     end;
  275.  
  276.     procedure DoHelpMenu;
  277.     begin
  278.         if has_AppleEvents then begin
  279.             SendSelfSimpleEvent(kAECoreSuite, kAEHelp);
  280.         end
  281.         else begin
  282.             DoHelp;
  283.         end;
  284.     end;
  285.  
  286.     procedure SetAboutMenu (themenu, theitem: integer);
  287.     begin
  288.         SetIDItemEnable(themenu, theitem, not ISWObjectFront(about_object));
  289.     end;
  290.  
  291.     procedure SetHelpMenu (themenu, theitem: integer);
  292.     begin
  293.         SetIDItemEnable(themenu, theitem, not ISWObjectFront(help_object));
  294.     end;
  295.  
  296.     procedure ExternalSetMenu (themenu, theitem: integer; x: ptr);
  297.     begin
  298.         SetIDItemEnable(themenu, theitem, not ISWObjectFront(DObject(x)));
  299.     end;
  300.  
  301.     function HandleAbout (event, reply: AppleEvent; refcon: longInt): OSErr;
  302.     begin
  303.         DoAbout;
  304.         HandleAbout := noErr;
  305.     end;
  306.  
  307.     function HandleHelp (event, reply: AppleEvent; refcon: longInt): OSErr;
  308.     begin
  309.         DoHelp;
  310.         HandleHelp := noErr;
  311.     end;
  312.  
  313.     procedure UpdateAboutBox;
  314.     begin
  315.         if about_object <> nil then begin
  316.             SetPort(about_object.window);
  317.             InvalRect(about_object.window^.portRect);
  318.         end;
  319.     end;
  320.  
  321.     procedure CloseAboutBox;
  322.     begin
  323.         if about_object <> nil then begin
  324.             about_object.DoClose;
  325.         end;
  326.     end;
  327.  
  328.     procedure OpenAboutBox;
  329.     begin
  330.         DoAbout;
  331.         SetPort(about_object.window);
  332.         DrawDialog(about_object.window);
  333.         ValidRect(about_object.window^.portRect);
  334.     end;
  335.  
  336. {$S Init}
  337.     procedure InitAboutHelp (obj: AboutStringsObject);
  338.         var
  339.             junk: OSErr;
  340.     begin
  341.         about_click_count := 0;
  342.         old_about := obj = nil;
  343.         strings := obj;
  344.         about_object := nil;
  345.         help_object := nil;
  346.         if has_AppleEvents then begin
  347.             junk := AEInstallEventHandler(kAECoreSuite, kAEAbout, @HandleAbout, 0, false);
  348.             if help_menu_text > 0 then begin
  349.                 junk := AEInstallEventHandler(kAECoreSuite, kAEHelp, @HandleHelp, 0, false);
  350.             end;
  351.         end;
  352.         SetFBoth(Cabout, @DoAboutMenu, @SetAboutMenu);
  353.         if help_menu_text > 0 then begin
  354.             SetFBoth(Chelp, @DoHelpMenu, @SetHelpMenu);
  355.         end;
  356.     end;
  357.  
  358. end.